--#include "data\config\boss\EquipBossConfig.lua" once   --装备boss


--[[
注册一些事件
]]
function ResisterEquipBossProc()
	--print("ResisterEquipBossProc...")
	for Idx, equipBossConfig in ipairs( EquipBossCfg.BossList ) do
		FubenTimeoutDispatcher.register( equipBossConfig.fubenId, OnEquipBossTimeout )				--注册场景、副本时间到后触发的事件
		SceneLogoutDispatcher.register( equipBossConfig.sceneId, OnLogoutEquipBoss )				--注册场景、副本中下线触发的事件

		SceneHandExitDispatcher.register( equipBossConfig.sceneId, OnEquipBossExitHandler )				--离开场景处理
	end
end

--[[
副本时间到
]]
function OnEquipBossTimeout( fubenPtr )
	local fubenId = Fuben.getFuBenId(fubenPtr)
	--print("OnEquipBossTimeout, fubenId="..fubenId)
	local equipBossConfig = GetEquipBossCfgByFubenId( fubenId )
	if not equipBossConfig then
		return
	end
	local fubenHandle = Fuben.getFubenHandle(fubenPtr)

	local actorId 	= Fuben.getOwnerId( fubenPtr )
	local actorPtr 	= Actor.getActorById( actorId )

	if actorPtr then
		local actorFubenPtr = Actor.getFubenPrt(actorPtr)
		local actorFubenHandle = Fuben.getFubenHandle(actorFubenPtr)
		if actorFubenHandle ~= fubenHandle then
			return
		end
	end
	--print("OnEquipBossTimeout, actorId="..actorId)
	if actorPtr and IsInEquipBossFuben( actorPtr ) then
		Actor.exitFuben( actorPtr )					
	end
end

function OnEquipBossExitHandler(sysarg)
	local fubenPtr 	= Actor.getFubenPrt(sysarg)
	local fubenId = Fuben.getFuBenId(fubenPtr)

	local equipBossConfig = GetEquipBossCfgByFubenId( fubenId )
	if not equipBossConfig then
		return
	end

	local actorId 	= Fuben.getOwnerId( fubenPtr )
	local actorPtr 	= Actor.getActorById( actorId )
	local fubenHandle = Fuben.getFubenHandle(fuBenPtr)
	--print("OnEquipBossTimeout, actorId="..actorId)
	if actorPtr and IsInEquipBossFuben( actorPtr ) then
		Fuben.setFubenTime( fubenHandle, 1 )						
	end
end

--[[
副本中下线
]]
function OnLogoutEquipBoss( sysarg )
	local sceneId 	= Actor.getSceneId( sysarg )
	local fubenPtr 	= Actor.getFubenPrt(sysarg)
	local fubenId 	= Fuben.getFuBenId(fubenPtr)

	--print("OnLogoutnEquipBoss, sceneId="..sceneId..", fubenId="..fubenId)
	DroplineSaveFubenHandler( sysarg )

	local actorId 	= Actor.getActorId( sysarg )
	local actorName	= Actor.getName( sysarg )
	local sceneId 	= Actor.getSceneId( sysarg )
	local fubenId 	= Actor.getFubenId( sysarg )
	System.sendCommonLog( GameLog.clFubenDropReset_Logout, actorId, actorName , 0, sceneId, fubenId,'','',"fuben logout")
end

--[[
副本中恢复上线
]]
function ProcLoginEquipBoss( sysarg, fubenPtr  )
	--print("ProcLoginEquipBoss...")
	if not fubenPtr then
		return
	end

	local fubenId  = Fuben.getFuBenId( fubenPtr )
	--print("ProcLoginEquipBoss, fubenId="..fubenId)
	local equipBossConfig  = GetEquipBossCfgByFubenId( fubenId )
	if not equipBossConfig then
		return
	end

	if fubenId ~= equipBossConfig.fubenId then 			--以正式副本为准
		return
	end

	local actorId 	= Actor.getActorId( sysarg )
	local actorName	= Actor.getName( sysarg )
	System.sendCommonLog( GameLog.clFubenDropReset_LoginTry, actorId, actorName , 0, 0, fubenId,'','', "EquipBoss login" )

	
	local fubenHandle = Fuben.getFubenHandle( fubenPtr )
	--print("ProcLoginEquipBoss, fubenHandle="..fubenHandle)
	if fubenHandle <= 0 then
		return
	end

	if not Fuben.isFubenExist( fubenHandle ) then			--副本已经不存在（被撤销）了
		return
	end

	--这里预防曾经有某玩家保存的副本handle正好与此副本相同的情况
	local actorId = Actor.getActorId( sysarg )
	local ownerId = Fuben.getOwnerId( fubenPtr )			--副本Owner
	--print("ProcLoginEquipBoss, actorId="..actorId..", ownerId="..ownerId)
	if actorId ~= ownerId then
		return
	end

	local enterPos = nil
	if equipBossConfig.enterPos then
		enterPos = equipBossConfig.enterPos
	elseif equipBossConfig.enterPosRand then
		local idx, randPos = GetItemIdxRandNoWeight( equipBossConfig.enterPosRand )
		enterPos = randPos
	end

	if not enterPos then
		return
	end

	
	if Actor.enterFuBen(sysarg, fubenHandle, equipBossConfig.sceneId, enterPos[1], enterPos[2]) then
		InitEquipBossPanel( sysarg, equipBossConfig)
		System.sendCommonLog( GameLog.clFubenDropReset_LoginOk, actorId, actorName , 0, equipBossConfig.sceneId, fubenId,
			'', '', "EquipBoss login ok" )
	end
end

--是否副本中
function IsInEquipBossFuben( sysarg )
	local fubenId = Actor.getFubenId( sysarg )
	for Idx, BossEquipCfg in pairs( EquipBossCfg.BossList ) do
		if BossEquipCfg.fubenId == fubenId then
			return true
		end
	end
	return false
end

--左侧面板
function InitEquipBossPanel( sysarg, equipBossCfg )
	local panelInfo = {}
	panelInfo.title = equipBossCfg.EquipBossName									--title
	panelInfo.subActivityId = equipBossCfg.fubenId

	panelInfo.awardTitle = ""
	panelInfo.awards 	 = {}
	panelInfo.buttons  	 = {1}
	local fubenPtr 		= Actor.getFubenPrt( sysarg )
	local restTime 	= Fuben.getFbTime( fubenPtr )
	--剩余时间
	panelInfo.timeTitle 	= Lang.ScriptTips.EquipBoss001
	panelInfo.restTime		= restTime

	panelInfo.contentTitle 	= Lang.ScriptTips.EquipBoss002

	local boss 	= GetEquipBossChoiceMonster(sysarg, equipBossCfg)
	if boss then
		local curNum = GetEquipBossCurrentMonsterNum(sysarg, fubenPtr)
		local monsterName = MonsterNameDeleteNumber(boss.monsterId)
		panelInfo.contents = {}
		panelInfo.contents[1] = string.format(Lang.ScriptTips.EquipBoss003, monsterName, boss.num - curNum, boss.num)

		OpenActivityRightPanel( sysarg, 1, enRightPanelActivity_EquipBoss, panelInfo )
	end
end

--[[
进入装备boss
]]
function EnterEquipBoss( sysarg, Idx )
	local equipBossConfig = GetEquipBossCfgByIdx( Idx )
	if not equipBossConfig then
		return
	end

	local dVar = Actor.getStaticVar(sysarg)
	dVar.equipBossCircle = Actor.getIntProperty(sysarg, PROP_ACTOR_CIRCLE)
	dVar.equipBossLevel = Actor.getIntProperty(sysarg, PROP_CREATURE_LEVEL)


	if CommonEnterScence( sysarg,  equipBossConfig, GameLog.clEquipBossEnterFee, Lang.LogTips.EquipBoss,
		 EquipBossCheck, EquipBossBeforeEnter ) then
		SendEquipBossInit(sysarg)

		local actorId 	= Actor.getActorId( sysarg )
		local fubenPtr 	= Actor.getFubenPrt( sysarg )
		Fuben.setOwnerId( fubenPtr, actorId )
		--local fubenHandle  	= Fuben.getFubenHandle(fubenPtr)
		--Fuben.setFubenTime(fubenHandle, equipBossConfig.fubenTime)
		EquipBossFreshMonster( sysarg, equipBossConfig )
		InitEquipBossPanel( sysarg, equipBossConfig)
	end
end

--计算积分
function CalEquipBossScore(sysarg)
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		svar.days = {}
	end
	if sVar.days.equipBossMaxScore and sVar.days.equipBossMaxScore >= EquipBossCfg.MaxOnlineScore then
		return
	end
	if not sVar.days.equipBossScore then
		sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
	end
	if not sVar.days.equipBossMaxScore then
		sVar.days.equipBossMaxScore = sVar.days.equipBossScore
	end
	if not sVar.days.equipBossStartTime then
		sVar.days.equipBossStartTime = time
	end
	local disTime = time - sVar.days.equipBossStartTime 
	local factor
	if disTime >= EquipBossCfg.EveryCalTime then
		 factor = math.floor(disTime / EquipBossCfg.EveryCalTime)
		 sVar.days.equipBossStartTime  = sVar.days.equipBossStartTime + factor * EquipBossCfg.EveryCalTime
		 local addVal = factor * EquipBossCfg.EveryCalTime * EquipBossCfg.EverySecondOnlineScore
		 sVar.days.equipBossScore = addVal + sVar.days.equipBossScore

		 sVar.days.equipBossMaxScore = sVar.days.equipBossMaxScore + addVal
	end
end

--进入副本前检查积分是否足够
function EquipBossCheck( sysarg, equipBossCfg )
	if equipBossCfg.LevelLimit then			            --判断进入等级要求
		if not Actor.checkActorLevel( sysarg, equipBossCfg.LevelLimit[2], equipBossCfg.LevelLimit[1] ) then
    		Actor.sendTipmsg(sysarg, string.format(Lang.ScriptTips.EquipBoss005, equipBossCfg.LevelLimit[1], equipBossCfg.LevelLimit[2]),ttFlyTip)
    		return false
    	end
	end
	CalEquipBossScore(sysarg)
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		svar.days = {}
	end
	if not sVar.days.equipBossScore then
		sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
	end

	if sVar.days.equipBossScore >= equipBossCfg.costOnlineScore then
		return true
	end

	Actor.sendTipmsg(sysarg, string.format(Lang.ScriptTips.EquipBoss004, equipBossCfg.costOnlineScore), ttFlyTip)
	return false
end

--进入副本前，扣积分
function EquipBossBeforeEnter( sysarg, equipBossCfg )
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		svar.days = {}
	end
	if not sVar.days.equipBossScore then
		sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
	end

	if sVar.days.equipBossScore >= equipBossCfg.costOnlineScore then
		sVar.days.equipBossScore = sVar.days.equipBossScore - equipBossCfg.costOnlineScore
		return true
	end
	return false
end

--根据index获取配置
function GetEquipBossCfgByIdx( Idx )
	return EquipBossCfg.BossList[Idx]
end

--根据场景id获取配置
function GetEquipBossCfgBySceneId( sceneId )
	for Idx, equipBossConfig in pairs( EquipBossCfg.BossList ) do
		if equipBossConfig.sceneId == sceneId then
			return equipBossConfig
		end
	end
	return nil
end

--根据副本id获取配置
function GetEquipBossCfgByFubenId( fubenId )
	for Idx, equipBossConfig in pairs( EquipBossCfg.BossList ) do
		if equipBossConfig.fubenId == fubenId then
			return equipBossConfig
		end
	end
	return nil
end

--获取当前转数boss配置
function GetEquipBossChoiceMonster(sysarg, equipBossConfig)
	local dVar = Actor.getStaticVar(sysarg)
	local circle = dVar.equipBossCircle
	local level = dVar.equipBossLevel
	if equipBossConfig and equipBossConfig.monsters then
		local item = GetElemByCond( equipBossConfig.monsters, circle )
		if not item then
			item = equipBossConfig.monsters[1]
		end
		if item and item.monster then
			local newItem = GetElemByCond( item.monster, level )
			if newItem and newItem.boss then
				return newItem.boss
			end
			return item.monster[1].boss
		end
	end
	return nil
end

--[[
获取副本中怪物数量
]]
function GetEquipBossCurrentMonsterNum(sysarg, fubenPtr)
	local fubenId = Fuben.getFuBenId( fubenPtr )
	local fubenCfg  = GetEquipBossCfgByFubenId( fubenId )
	if not fubenCfg then
		return
	end

	local boss = GetEquipBossChoiceMonster(sysarg, fubenCfg)

	local fubenHandle  	= Fuben.getFubenHandle(fubenPtr)
	local sceneHandle 	= Fuben.getSceneHandleById(fubenCfg.sceneId, fubenHandle)
	local monsterNum 	= 0
	if boss then
		monsterNum = Fuben.getMyMonsterCount( sceneHandle, boss.monsterId )
	end
	return monsterNum
end

--[[
刷怪
]]
function EquipBossFreshMonster( sysarg, bossCfg )
	local fubenPtr 		= Actor.getFubenPrt(sysarg)
	local fubenHandle 	= Fuben.getFubenHandle(fubenPtr)
	local boss = GetEquipBossChoiceMonster(sysarg, bossCfg)
	if boss then
		FreshCommonMonsters( {boss}, fubenHandle, true )	
	end
end


--[[
杀怪
]]
function OnEquipBossMonsterDie( monster, sysarg, monId )
	local sceneId = Actor.getSceneId( monster )
	local equipBossCfg = GetEquipBossCfgBySceneId( sceneId )
	if not equipBossCfg then
		return
	end
	--print("OnEquipBossMonsterDie, monId="..monId..", cityIdx="..cityCfg.cityIdx)

	local fubenPtr = Actor.getFubenPrt( monster )				--怪物所在副本
	local fubenHandle = Fuben.getFubenHandle( fubenPtr )
	

	local actorId 	= Fuben.getOwnerId( fubenPtr )
	local actorPtr 	= Actor.getActorById( actorId )
	--print("OnEquipBossMonsterDie, actorId="..actorId)
	if actorPtr and IsInEquipBossFuben( actorPtr ) then 			--玩家在线并且在副本中

		local panelInfo 	= {}
		panelInfo.contents 	= {}

		local restTime 	= Fuben.getFbTime( fubenPtr )
		
		--print("ChangeMaterialFubenRightPanel, monNumAll="..monNumAll..", monNumNow="..monNumNow..", restTime="..restTime)

		panelInfo.contentTitle 	= Lang.ScriptTips.EquipBoss002

		local boss 	= GetEquipBossChoiceMonster(actorPtr, equipBossCfg)
		if boss then
			local curNum = GetEquipBossCurrentMonsterNum(actorPtr, fubenPtr)
			local monsterName = MonsterNameDeleteNumber(boss.monsterId)
			panelInfo.contents = {}
			panelInfo.contents[1] = string.format(Lang.ScriptTips.EquipBoss003, monsterName, boss.num - curNum, boss.num)

			panelInfo.buttons  	= {1}

			ChangeActivityRightPanel( actorPtr, panelInfo )
		end
		
	end
end

--发送数据
function SendEquipBossInit(sysarg)
	local npack = DataPack.allocPacket(sysarg, LogicCmd.activitySys.sysId, LogicCmd.activitySys.sub.sEquipBossData)
	if npack then
		local sVar = Actor.getStaticVar(sysarg)
		local time = System.getCurrMiniTime()
		if not sVar.days then
			sVar.days = {}
		end
		if not sVar.days.equipBossScore then
			sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
		end
		if not sVar.days.equipBossStartTime then
			sVar.days.equipBossStartTime = time
		end
		local lastTime = EquipBossCfg.EveryCalTime - time + sVar.days.equipBossStartTime
		if sVar.days.equipBossMaxScore and sVar.days.equipBossMaxScore >= EquipBossCfg.MaxOnlineScore then
		 	lastTime = -1
		end
		DataPack.writeInt(npack, sVar.days.equipBossScore)
		DataPack.writeInt(npack, lastTime)
		DataPack.flush(npack)
	end
end

--处理操作请求
function HandleEquipBoss(sysarg, packet)
	local opType = DataPack.readByte(packet)
	if opType == 1 then
		CalEquipBossScore(sysarg)
		SendEquipBossInit(sysarg)
	elseif opType == 2 then
		local Idx = DataPack.readByte(packet)
		EnterEquipBoss( sysarg, Idx )
	end
end

--登录
function onEquipBossActorLoginHandler(sysarg)
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		sVar.days = {}
	end
	if not sVar.days.equipBossScore then
		sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
	end
	if not sVar.days.equipBossMaxScore then
		sVar.days.equipBossMaxScore = sVar.days.equipBossScore
	end
	sVar.days.equipBossStartTime = time
	if sVar.days.equipBossLastTime then
		sVar.days.equipBossStartTime = sVar.days.equipBossStartTime - sVar.days.equipBossLastTime
		sVar.days.equipBossLastTime = nil
	end
end

--登出
function onEquipBossActorLogOutHandler(sysarg)
	CalEquipBossScore(sysarg)
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		sVar.days = {}
	end
	if not sVar.days.equipBossScore then
		sVar.days.equipBossScore = EquipBossCfg.DefaultOnlineScore
	end
	if not sVar.days.equipBossMaxScore then
		sVar.days.equipBossMaxScore = sVar.days.equipBossScore
	end
	if not sVar.days.equipBossStartTime then
		sVar.days.equipBossStartTime = time
	end
	sVar.days.equipBossLastTime = time - sVar.days.equipBossStartTime
end

function GmAddEquipBossOnlineScore(sysarg)
	local sVar = Actor.getStaticVar(sysarg)
	local time = System.getCurrMiniTime()
	if not sVar.days then
		sVar.days = {}
	end

	sVar.days.equipBossMaxScore = 10000
	sVar.days.equipBossScore = 10000
end
